Data Mapping এবং Schema Design হলো Elasticsearch-এ ডেটা সংরক্ষণ এবং সার্চ অপারেশন কার্যকরীভাবে পরিচালনার জন্য অত্যন্ত গুরুত্বপূর্ণ দুটি ধারণা। Mapping নির্ধারণ করে ডকুমেন্টের ফিল্ডগুলো কী ধরনের ডেটা ধারণ করবে, এবং Schema Design নির্ধারণ করে কিভাবে ডেটার স্ট্রাকচার তৈরি করা হবে যাতে সার্চ এবং অ্যানালাইসিস অপারেশন দ্রুত এবং কার্যকরী হয়। নিচে Data Mapping এবং Schema Design-এর বিস্তারিত আলোচনা করা হলো।
Elasticsearch-এ Mapping হলো একটি প্রক্রিয়া, যা ডকুমেন্টের প্রতিটি ফিল্ডের ডেটা টাইপ এবং বৈশিষ্ট্য নির্ধারণ করে। এটি Schema Design-এর একটি অংশ হিসেবে কাজ করে এবং Elasticsearch-কে সঠিকভাবে ডেটা ইন্ডেক্স এবং সার্চ করতে সহায়ক করে। Mapping সাধারণত ইন্ডেক্স তৈরির সময় নির্ধারণ করা হয়, তবে পরে কাস্টমাইজও করা যায়।
true
থাকে, যা ফিল্ডটিকে ইন্ডেক্স করতে সহায়ক করে। এটি false
করলে ফিল্ডটি ইন্ডেক্স করা হবে না।text
ফিল্ডে টোকেনাইজেশন এবং এনালাইসিসের জন্য নির্দিষ্ট অ্যানালাইজার ব্যবহার করা যায়।date
ফিল্ডের ফরম্যাট নির্ধারণ করতে ব্যবহৃত হয়।PUT /my-index
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"occupation": { "type": "keyword" },
"join_date": { "type": "date", "format": "yyyy-MM-dd" },
"location": { "type": "geo_point" }
}
}
}
"name"
ফিল্ডটি text
টাইপ হিসেবে নির্ধারণ করা হয়েছে, যা টেক্সট এনালাইসিসের জন্য ব্যবহৃত হবে।"age"
ফিল্ডটি একটি integer
হিসেবে সংরক্ষিত হবে।"occupation"
ফিল্ডটি keyword
টাইপ, যা সুনির্দিষ্ট মান সংরক্ষণ এবং ইন্ডেক্স করতে ব্যবহৃত হবে।"join_date"
ফিল্ডে date
টাইপ নির্ধারণ করা হয়েছে এবং ফরম্যাট "yyyy-MM-dd"
উল্লেখ করা হয়েছে।"location"
ফিল্ডে geo_point
টাইপ নির্ধারণ করা হয়েছে, যা ভৌগোলিক পয়েন্ট সংরক্ষণের জন্য ব্যবহৃত হবে।Elasticsearch-এ Schema Design মূলত Data Mapping-এর মাধ্যমে ডেটার স্ট্রাকচার নির্ধারণ করে এবং এটি সার্চ অপারেশনের গতি ও কার্যকারিতা বাড়াতে সহায়ক হয়। Schema Design ভালোভাবে করা না হলে, সার্চ এবং ইন্ডেক্সিং ধীরগতির হতে পারে এবং রিসোর্স বেশি খরচ হতে পারে।
ফিল্ড টাইপ সঠিকভাবে নির্ধারণ করা:
integer
বা float
, এবং সুনির্দিষ্ট কিওয়ার্ডের জন্য keyword
ব্যবহার করা।Text এবং Keyword ফিল্ডের পার্থক্য বোঝা:
Indexing অপ্টিমাইজ করা:
"index": false
সেট করা যায়।অন্যান্য বৈশিষ্ট্য ব্যবহার করা:
text
ফিল্ডে অ্যানালাইজার ব্যবহার করে কাস্টম সার্চ অপারেশন তৈরি করা যায়।geo_point
বা geo_shape
টাইপ ব্যবহার করা যেতে পারে।PUT /employee-index
{
"mappings": {
"properties": {
"employee_id": { "type": "keyword" },
"full_name": { "type": "text", "analyzer": "standard" },
"salary": { "type": "float" },
"is_active": { "type": "boolean" },
"hire_date": { "type": "date", "format": "yyyy-MM-dd" }
}
}
}
"employee_id"
একটি keyword
ফিল্ড, যা ইউনিকভাবে প্রতিটি এমপ্লয়িকে চিহ্নিত করবে।"full_name"
একটি text
ফিল্ড এবং standard
অ্যানালাইজার ব্যবহার করা হয়েছে।"salary"
একটি float
টাইপ, যা এমপ্লয়ির বেতন সংরক্ষণ করবে।"is_active"
একটি boolean
ফিল্ড, যা কর্মচারীর সক্রিয় বা নিষ্ক্রিয় অবস্থা চিহ্নিত করবে।"hire_date"
একটি date
ফিল্ড, যেখানে "yyyy-MM-dd"
ফরম্যাটে তারিখ সংরক্ষণ করা হবে।PUT /fixed-index
{
"mappings": {
"dynamic": "strict",
"properties": {
"product_id": { "type": "keyword" },
"product_name": { "type": "text" }
}
}
}
"dynamic": "strict"
ব্যবহার করে নতুন ফিল্ড অ্যালাউ করা বন্ধ করা হয়েছে। কেবলমাত্র আগে থেকে নির্ধারিত ফিল্ডগুলো ইন্ডেক্স করা হবে।Elasticsearch-এ Data Mapping এবং Schema Design ডেটা সংরক্ষণ এবং সার্চ অপারেশনের জন্য অপরিহার্য
Mapping হলো Elasticsearch-এ ডকুমেন্টের প্রতিটি ফিল্ডের ডেটা টাইপ এবং গঠন নির্ধারণ করার একটি প্রক্রিয়া। এটি Elasticsearch-কে সঠিকভাবে ডেটা ইন্ডেক্স এবং সার্চ করতে সহায়তা করে। Mapping মূলত একটি স্কিমা (schema) হিসেবে কাজ করে, যা নির্ধারণ করে ডকুমেন্টের বিভিন্ন ফিল্ড কী ধরনের ডেটা ধারণ করবে, যেমন টেক্সট, সংখ্যা, তারিখ, বা ভৌগোলিক পয়েন্ট। Mapping ছাড়া Elasticsearch ডেটাকে ঠিকভাবে ইন্ডেক্স বা রিট্রিভ করতে পারবে না।
Mapping Elasticsearch-এ ডেটা ইন্ডেক্সিং এবং সার্চ অপারেশন কার্যকরী করতে সহায়ক। এর কিছু প্রধান ভূমিকা নিচে উল্লেখ করা হলো:
{
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"join_date": { "type": "date", "format": "yyyy-MM-dd" },
"is_active": { "type": "boolean" }
}
}
"name"
ফিল্ড text
, "age"
ফিল্ড integer
, "join_date"
ফিল্ড date
, এবং "is_active"
ফিল্ড boolean
টাইপ হিসেবে নির্ধারিত হয়েছে।text
টাইপের ফিল্ডে ফ্রি-টেক্সট সার্চ করা হয়, যেখানে keyword
টাইপের ফিল্ডে এক্সাক্ট ম্যাচ সার্চ করা হয়।{
"properties": {
"content": {
"type": "text",
"analyzer": "english"
}
}
}
"content"
ফিল্ডে "english"
অ্যানালাইজার ব্যবহার করা হয়েছে, যা ইংরেজি ভাষার টেক্সট এনালাইসিসের জন্য উপযোগী।yyyy-MM-dd
ফরম্যাট)।{
"properties": {
"location": {
"type": "geo_point"
}
}
}
"location"
ফিল্ডটি একটি ভৌগোলিক পয়েন্ট (latitude এবং longitude) ধারণ করবে।Dynamic Mapping:
Explicit (Static) Mapping:
সঠিক ফিল্ড টাইপ নির্ধারণ করা:
integer
বা float
সংখ্যা সংরক্ষণের জন্য এবং keyword
ব্যবহার করা উচিত এক্সাক্ট ম্যাচের জন্য।প্রয়োজন অনুযায়ী অ্যানালাইজার ব্যবহার করা:
Dynamic Mapping সীমিত রাখা:
ফিল্ড ইন্ডেক্সিং এবং স্টোরেজ পরিচালনা:
Mapping হলো Elasticsearch-এ ডেটা ইন্ডেক্সিং এবং সার্চের জন্য একটি গুরুত্বপূর্ণ উপাদান, যা ডকুমেন্টের ফিল্ড এবং তাদের ডেটা টাইপ নির্ধারণ করে। এটি Elasticsearch-কে ডেটা সঠিকভাবে সংরক্ষণ এবং রিট্রিভ করতে সহায়ক করে। Mapping সঠিকভাবে নির্ধারণ করা হলে সার্চ অপারেশন দ্রুত এবং কার্যকরী হয় এবং বড় আকারের ডেটাবেস পরিচালনা সহজ হয়।
Elasticsearch-এ ডেটা ইন্ডেক্সিং-এর জন্য Dynamic এবং Static Mapping উভয় পদ্ধতি ব্যবহার করা যায়। প্রতিটি পদ্ধতির নিজস্ব সুবিধা এবং ব্যবহারিক ক্ষেত্রে রয়েছে। নিচে Dynamic এবং Static Mapping-এর বিস্তারিত আলোচনা এবং কখন, কীভাবে এগুলো ব্যবহার করা হয় তা নিয়ে আলোচনা করা হলো।
POST /my-dynamic-index/_doc
{
"name": "John Doe",
"age": 30,
"occupation": "Engineer",
"join_date": "2022-10-01"
}
"name"
, "age"
, "occupation"
, এবং "join_date"
ফিল্ড সনাক্ত করে এবং সেগুলোর ডেটা টাইপ স্বয়ংক্রিয়ভাবে নির্ধারণ করে:"name"
-> text
"age"
-> integer
"occupation"
-> text
"join_date"
-> date
float
বা integer
হিসেবে সনাক্ত করা।PUT /my-static-index
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"occupation": { "type": "keyword" },
"join_date": { "type": "date", "format": "yyyy-MM-dd" }
}
}
}
"name"
ফিল্ড text
টাইপ হিসেবে নির্ধারণ করা হয়েছে।"age"
ফিল্ড integer
হিসেবে, "occupation"
ফিল্ড keyword
হিসেবে এবং "join_date"
ফিল্ড date
টাইপ নির্ধারণ করা হয়েছে।PUT /mixed-index
{
"mappings": {
"dynamic": "true",
"properties": {
"product_id": { "type": "keyword" },
"price": { "type": "float" }
}
}
}
"product_id"
এবং "price"
ফিল্ড Static Mapping-এ নির্ধারিত, কিন্তু অন্য নতুন ফিল্ড Dynamic Mapping ব্যবহার করে ইন্ডেক্স করা হবে।
Elasticsearch-এ Field Data Type হলো একটি গুরুত্বপূর্ণ উপাদান, যা নির্ধারণ করে প্রতিটি ফিল্ড কী ধরনের ডেটা ধারণ করবে। এটি Elasticsearch-কে ডেটা সঠিকভাবে ইন্ডেক্স করতে এবং সার্চ অপারেশন কার্যকরী করতে সহায়ক করে। Elasticsearch বিভিন্ন ধরনের ডেটা টাইপ সমর্থন করে, যেমন text
, keyword
, integer
, date
, এবং আরও অনেক। প্রতিটি ডেটা টাইপের নির্দিষ্ট ব্যবহার এবং প্রয়োগ রয়েছে, যা নিচে আলোচনা করা হলো।
{
"properties": {
"description": {
"type": "text",
"analyzer": "standard"
}
}
}
"description"
ফিল্ডে text
টাইপ ব্যবহার করা হয়েছে, যা ফ্রি-টেক্সট ডেটা সংরক্ষণ করবে এবং "standard"
অ্যানালাইজার ব্যবহার করে টোকেনাইজ করা হবে।{
"properties": {
"status": {
"type": "keyword"
}
}
}
"status"
ফিল্ডে keyword
টাইপ ব্যবহার করা হয়েছে, যা এক্সাক্ট ম্যাচ সার্চের জন্য সঠিক।Elasticsearch-এ কয়েকটি Numeric ডেটা টাইপ রয়েছে:
Numeric ডেটা টাইপ সাধারণত সংখ্যা, বয়স, স্কোর, প্রাইস, বা অন্যান্য গাণিতিক মান সংরক্ষণের জন্য ব্যবহৃত হয়।
{
"properties": {
"price": {
"type": "float"
},
"quantity": {
"type": "integer"
}
}
}
"price"
ফিল্ডে float
এবং "quantity"
ফিল্ডে integer
টাইপ ব্যবহার করা হয়েছে।{
"properties": {
"join_date": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
"join_date"
ফিল্ডে date
টাইপ ব্যবহার করা হয়েছে এবং "yyyy-MM-dd"
ফরম্যাট নির্ধারণ করা হয়েছে।true
বা false
মান সংরক্ষণের জন্য ব্যবহৃত হয়।{
"properties": {
"is_active": {
"type": "boolean"
}
}
}
"is_active"
ফিল্ডে boolean
টাইপ ব্যবহার করা হয়েছে, যা সক্রিয় বা নিষ্ক্রিয় অবস্থা সংরক্ষণ করবে।{
"properties": {
"location": {
"type": "geo_point"
}
}
}
"location"
ফিল্ডে geo_point
টাইপ ব্যবহার করা হয়েছে, যা একটি ভৌগোলিক পয়েন্ট ধারণ করবে।{
"properties": {
"address": {
"type": "object",
"properties": {
"street": { "type": "text" },
"city": { "type": "keyword" },
"zipcode": { "type": "integer" }
}
}
}
}
"address"
ফিল্ড একটি object
টাইপ, যেখানে street
, city
, এবং zipcode
সংরক্ষিত হয়েছে।{
"properties": {
"comments": {
"type": "nested",
"properties": {
"user": { "type": "keyword" },
"message": { "type": "text" },
"created_at": { "type": "date" }
}
}
}
}
"comments"
ফিল্ড nested
টাইপ ব্যবহার করা হয়েছে, যা প্রতিটি মন্তব্যের জন্য আলাদা ডকুমেন্ট হিসেবে কাজ করবে।{
"properties": {
"client_ip": {
"type": "ip"
}
}
}
"client_ip"
ফিল্ডে ip
টাইপ ব্যবহার করা হয়েছে, যা ক্লায়েন্টের IP ঠিকানা ধারণ করবে।{
"properties": {
"suggest": {
"type": "completion"
}
}
}
"suggest"
ফিল্ডে completion
টাইপ ব্যবহার করা হয়েছে, যা ইনপুট টেক্সটের জন্য দ্রুত সাজেশন প্রদান করবে।Elasticsearch-এ Field Data Type এবং তাদের প্রয়োগ সঠিকভাবে নির্ধারণ করা জরুরি, কারণ এটি ডেটা ইন্ডেক্স এবং সার্চ অপারেশনের কার্যকারিতা ও পারফরম্যান্স নির্ধারণ করে। প্রতিটি ডেটা টাইপ নির্দিষ্ট প্রয়োজনের উপর ভিত্তি করে ব্যবহার করা উচিত। সঠিক ডেটা টাইপ নির্বাচন করে এবং সেটি কনফিগার করে, Elasticsearch-কে আরও কার্যকর এবং দ্রুততর করে তোলা সম্ভব।
Elasticsearch-এ Schema Design একটি গুরুত্বপূর্ণ কাজ, যা ডেটার কাঠামো এবং সার্চ অপারেশনের পারফরম্যান্স নির্ধারণ করে। একটি ভালোভাবে পরিকল্পিত স্কিমা Elasticsearch-কে ডেটা ইন্ডেক্স এবং সার্চ অপারেশন দ্রুত ও কার্যকরভাবে পরিচালনা করতে সহায়ক করে। নিচে Schema Design-এর কিছু বেস্ট প্র্যাকটিস আলোচনা করা হলো, যা অনুসরণ করে আপনি Elasticsearch-এর পারফরম্যান্স এবং কার্যকারিতা উন্নত করতে পারবেন।
"price": { "type": "text" }
"price": { "type": "float" }
{
"properties": {
"title": { "type": "text" },
"category": { "type": "keyword" }
}
}
"title"
ফিল্ডে text
এবং "category"
ফিল্ডে keyword
টাইপ ব্যবহার করা হয়েছে।{
"properties": {
"description": { "type": "text", "index": false },
"name": { "type": "keyword" }
}
}
"description"
ফিল্ড ইন্ডেক্স করা হয়নি, কারণ এটি সার্চ অপারেশনের জন্য প্রয়োজন নেই।PUT /fixed-index
{
"mappings": {
"dynamic": "strict",
"properties": {
"username": { "type": "keyword" },
"created_at": { "type": "date", "format": "yyyy-MM-dd" }
}
}
}
"dynamic": "strict"
ব্যবহার করে Dynamic Mapping বন্ধ রাখা হয়েছে।{
"properties": {
"comments": {
"type": "nested",
"properties": {
"user": { "type": "keyword" },
"message": { "type": "text" }
}
}
}
}
"comments"
ফিল্ডে nested
টাইপ ব্যবহার করা হয়েছে, যা জটিল কোয়েরির জন্য উপযোগী।{
"properties": {
"event_date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }
}
}
"event_date"
ফিল্ডে কাস্টম ফরম্যাট নির্ধারণ করা হয়েছে।{
"properties": {
"location": { "type": "geo_point" }
}
}
"location"
ফিল্ডে geo_point
টাইপ ব্যবহার করা হয়েছে।{
"properties": {
"suggest": { "type": "completion" }
}
}
"suggest"
ফিল্ডে completion
টাইপ ব্যবহার করা হয়েছে, যা অটো-কমপ্লিশন সার্চের জন্য উপযোগী।PUT /optimized-index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
Elasticsearch-এ Schema Design করার সময় কিছু বেস্ট প্র্যাকটিস অনুসরণ করলে ইন্ডেক্সিং এবং সার্চ অপারেশনের পারফরম্যান্স ও কার্যকারিতা উন্নত হয়। সঠিক ফিল্ড টাইপ নির্ধারণ, প্রয়োজনীয় ফিল্ডগুলো ইন্ডেক্স করা, এবং Dynamic Mapping নিয়ন্ত্রণ করার মতো চর্চাগুলো Elasticsearch-কে আরও কার্যকর করে তোলে। Schema Design